﻿using System;
using System.Collections.Generic;
using System.Text;
using NIIT.SaoBacDau.Aupi.HospitalManagement.Entities;
using NIIT.SaoBacDau.Aupi.HospitalManagement.DataAccess;
using System.Text.RegularExpressions;

namespace NIIT.SaoBacDau.Aupi.HospitalManagement.BusinessLogic
{

    public enum ErrorAddPatient{NoError,SQLError}
    
    public class BL_Patients
    {
        public static int PtID()
        {
            return DAO_Patient.PtID().PatientID;
        }
        
        public static ErrorAddPatient AddQuickPatientError(Obj_Patient patient)
        {
            bool Excute = DAO_Patient.AddQPT(patient);
            if (Excute == true)
                return ErrorAddPatient.SQLError;
            else if (Excute == false)
                return ErrorAddPatient.NoError;
            else
                return ErrorAddPatient.NoError;
        }

        public static int PatientError(Obj_Patient patient, int typeaddpatient,int type)
        {
            int Error = 000;
            Regex rstring = new Regex(@"^[a-zA-Z\s]{2,30}$");
            Regex rnumber = new Regex("^[0-9]{1,6}$");
            Regex rphone = new Regex("^[0-9]{10,11}$");
            Regex remail = new Regex(@"\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b");
            // Nếu tên bệnh nhân là rỗng
            if (string.IsNullOrEmpty(patient.Name))
                return Error = 101;
            //Nếu tên bệnh nhân không đúng định dạng
            else if (rstring.IsMatch(patient.Name) == false)
                return Error = 102;
            //Nếu số nhà không phải là rỗng 
            else if (string.IsNullOrEmpty(patient.HouseID) == false)
            {
                //Nếu số nhà không đúng định dạng
                if (rnumber.IsMatch(patient.HouseID) == false)
                    return Error = 103;
                //Nếu xã - phường - trị trấn không phải là rỗng
                else if (string.IsNullOrEmpty(patient.Ward) == true)
                    return Error = 104;
                //Nếu xã - phường - trị không đúng định dạng
                else if (rstring.IsMatch(patient.Ward) == false)
                    return Error = 105;
                //Nếu huyện không phải là rỗng
                else if (string.IsNullOrEmpty(patient.District) == true)
                    return Error = 106;
                //Nếu huyện không đúng định dạng
                else if (rstring.IsMatch(patient.District) == false)
                    return Error = 107;
                //Nếu dân tộc không phải là rỗng
                else if (string.IsNullOrEmpty(patient.Ethnic) == true)
                    return Error = 109;
                // Nếu dân tộc không đúng định dạng
                else if (rstring.IsMatch(patient.Ethnic) == false)
                    return Error = 110;
                // Nếu số điện thoại không phải là rỗng
                else if (string.IsNullOrEmpty(patient.PhoneNumber) == false)
                {
                    //Nếu số điện thoại không đúng định dạng
                    if (rphone.IsMatch(patient.PhoneNumber) == false)
                        return Error = 108;
                    #region Nếu số điện thoại đúng định dạng
                    else
                    {
                        return BL_AddressEmail(patient, typeaddpatient, ref Error, rstring, rphone, remail,type);
                    }
                    #endregion
                }
                #region Nếu số điện thoại là rỗng
                else
                {
                    return BL_AddressEmail(patient, typeaddpatient, ref Error, rstring, rphone, remail,type);
                }
                #endregion
            }
            //Nếu xã - phường - trị trấn không phải là rỗng
            else if (string.IsNullOrEmpty(patient.Ward) == true)
                return Error = 104;
            //Nếu xã - phường - trị không đúng định dạng
            else if (rstring.IsMatch(patient.Ward) == false)
                return Error = 105;
            //Nếu huyện không phải là rỗng
            else if (string.IsNullOrEmpty(patient.District) == true)
                return Error = 106;
            //Nếu huyện không đúng định dạng
            else if (rstring.IsMatch(patient.District) == false)
                return Error = 107;
            //Nếu dân tộc không phải là rỗng
            else if (string.IsNullOrEmpty(patient.Ethnic) == true)
                return Error = 109;
            // Nếu dân tộc không đúng định dạng
            else if (rstring.IsMatch(patient.Ethnic) == false)
                return Error = 110;
            // Nếu số điện thoại không phải là rỗng
            else if (string.IsNullOrEmpty(patient.PhoneNumber) == false)
            {   
                //Nếu số điện thoại không đúng định dạng
                if (rphone.IsMatch(patient.PhoneNumber) == false)
                    return Error = 108;
                #region Nếu số điện thoại đúng định dạng
                else
                {
                    return BL_AddressEmail(patient, typeaddpatient, ref Error, rstring, rphone, remail,type);
                }
                #endregion             
            }
            #region Nếu số điện thoại là rỗng
            else
            {
                return BL_AddressEmail(patient, typeaddpatient, ref Error, rstring, rphone, remail,type);
            }
            #endregion
            return Error;
        }

        private static int BL_AddressEmail(Obj_Patient patient, int typeaddpatient, ref int Error, Regex rstring, Regex rphone, Regex remail,int type)
        {
            #region Nếu địa chỉ email không phải là rỗng
            if (string.IsNullOrEmpty(patient.AddressEmail) == false)
            {
                //nếu đị chỉ email không đúng định dạng
                if (remail.IsMatch(patient.AddressEmail) == false)
                    return Error = 111;
                // Nếu địa chỉ email đúng định dạng 
                else
                {
                    #region Nếu nghề nghiệp không phải là rỗng
                    if (string.IsNullOrEmpty(patient.Occupation) == false)
                    {
                        //Nếu nghề nghiệp không đúng định dạng
                        if (rstring.IsMatch(patient.Occupation) == false)
                            return Error = 112;
                        else//Nếu nghề nghiệp đúng định dạng
                        {
                            return BL_Contact(patient, typeaddpatient, ref Error, rstring, rphone,type);
                        }
                    }
                    #endregion
                    #region Nếu nghề nghiệp là rỗng
                    else
                    {
                        return BL_Contact(patient, typeaddpatient, ref Error, rstring, rphone,type);

                    }
                    #endregion
                }
            }
            #endregion

            #region Nếu địa chỉ email là rỗng
            else
            {
                #region Nếu nghề nghiệp không phải là rỗng
                if (string.IsNullOrEmpty(patient.Occupation) == false)
                {
                    //Nếu nghề nghiệp không đúng định dạng
                    if (rstring.IsMatch(patient.Occupation) == false)
                        return Error = 112;
                    else//Nếu nghề nghiệp đúng định dạng
                    {
                        return BL_Contact(patient, typeaddpatient, ref Error, rstring, rphone,type);
                    }
                }
                #endregion

                #region Nếu nghề nghiệp là rỗng
                else
                {
                    return BL_Contact(patient, typeaddpatient, ref Error, rstring, rphone,type);

                }
                #endregion
            }
            #endregion
        }

        private static int BL_Contact(Obj_Patient patient, int typeaddpatient, ref int Error, Regex rstring, Regex rphone,int type)
        {
            #region Nếu người liên hệ không phải là rỗng
            if (string.IsNullOrEmpty(patient.ContactPerson) == false)
            {//Nếu tên người liên hệ không đúng định dạng
                if (rstring.IsMatch(patient.ContactPerson) == false)
                    return Error = 113;
                // Nếu tên người liên hệ đúng định dạng
                else
                {// Nếu số điện thoại người liên hệ không phải là rỗng
                    if (rphone.IsMatch(patient.ContactPhone) == false)
                        return Error = 114;
                    // Nếu số điện thoại người liên hệ là rỗng
                    else
                    {
                        return ExcuteAddPatient(patient, typeaddpatient, ref Error,type);
                    }
                }
            }
            #endregion

            #region Nếu người liên hệ là rỗng
            else
            {
                return ExcuteAddPatient(patient, typeaddpatient, ref Error,type);
            }
            #endregion
        }

        private static int ExcuteAddPatient(Obj_Patient patient, int typeaddpatient, ref int Error,int type)
        {
            if (type == 1)
            {
                bool ErrorExcute = DAO_Patient.AddPatient(patient, typeaddpatient);
                if (ErrorExcute == false)
                    return Error = 000;
                else
                    return Error = 1000;
            }
            else
            {
                bool ErrorExcute = DAO_Patient.EditPatient(patient,typeaddpatient);
                if (ErrorExcute == false)
                    return Error = 000;
                else
                    return Error = 1000;
            }
            return Error;
        }
            
        public static Obj_Patient EditPatient()
        {
            throw new NotImplementedException();
        }
        public static Obj_Patient Patient(Obj_Patient patient)
        {
            return DAO_Patient.ObjPatient(patient);
        }

        public static List<Obj_Patient> ListPatient(int value, int to)
        {
            return DAO_Patient.ListObjPatient(value,to);
        }

        public static Obj_Patient SearchPatient(int p, Obj_Patient obj)
        {
            return DAO_Patient.SearchPatient(p,obj);
        }

        public static bool CheckPatient(string p)
        {
            Regex rnumber = new Regex("^[0-9]{1,6}$");
            if (rnumber.IsMatch(p) == false)
                return false;
            else
                return true;
        }
    }
}
